package systeme;

import java.util.Collections;

import org.apache.log4j.Logger;

import ihm.Deplacement;

public class ArretEtage extends Etat {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(ArretEtage.class);

	private int mSensPrecedent;

	public ArretEtage(Ascenseur pAscenseur, Etat pEtatPrecedent) {
		super(pAscenseur, pEtatPrecedent);
		logger.info("Changement etat");
		mAscenseur.getCabine().arreter();
		mSensPrecedent = mAscenseur.getSens();
		Deplacement depAEnlever;
		if (mSensPrecedent == MONTEE) {
			 incrementerEtage();
			depAEnlever = mAscenseur.getMonteelist().get(0);
		} else {
			 decrementerEtage();
			depAEnlever = mAscenseur.getDescentelist().get(0);
		}
		enleverDuStock(depAEnlever);
		mAscenseur.maj(mAscenseur.getEtageCourant(), INDEFINI);

	}

	/**
	 * redirige vers les etats suivant
	 */
	public void etatSuivant() {
		boolean isStockVide = mAscenseur.getDescentelist().isEmpty()
				&& mAscenseur.getMonteelist().isEmpty();
		if (isStockVide) {
			mAscenseur.setEtat(new AttenteDemande(mAscenseur, this));
		} else if (mAscenseur.getDescentelist().isEmpty()) {
			mAscenseur.getCabine().monter();
			mAscenseur.setEtat(new Montee(mAscenseur, this));
		} else if (mAscenseur.getMonteelist().isEmpty()){
			mAscenseur.getCabine().descendre();
			mAscenseur.setEtat(new Descendre(mAscenseur, this));
		}
	}

	private void enleverDuStock(Deplacement pDepAEnlever) {
		mAscenseur.getDescentelist().remove(pDepAEnlever);
		mAscenseur.getMonteelist().remove(pDepAEnlever);
		pDepAEnlever.setSensIndefini();
		mAscenseur.getDescentelist().remove(pDepAEnlever);
		mAscenseur.getMonteelist().remove(pDepAEnlever);
		mAscenseur.getIhm().eteindreBouton(pDepAEnlever);
	}

	@Override
	public void signalerChangementDEtage() {
		logger.info("Signalement de changement d'etage -- impossible ");
	}

	@Override
	protected void handle(Deplacement pDep) {
		this.mEtatPrecedent = null;
		if (pDep.getEtage() < mAscenseur.getEtageCourant()) {
			mAscenseur.getCabine().descendre();
			mAscenseur.getDescentelist().add(pDep);
		} else if (pDep.getEtage() > mAscenseur.getEtageCourant()) {
			mAscenseur.getCabine().descendre();
			mAscenseur.getMonteelist().add(pDep);
		}
		etatSuivant();
		mAscenseur.getIhm().allumerBouton(pDep);

	}

}
